/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package entidades;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author Daniel Cruz
 */
@Entity
@Table(name = "reserva")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Reserva.findAll", query = "SELECT r FROM Reserva r"),
    @NamedQuery(name = "Reserva.findByVolumenId", query = "SELECT r FROM Reserva r WHERE r.reservaPK.volumenId = :volumenId"),
    @NamedQuery(name = "Reserva.findByNumEjemplar", query = "SELECT r FROM Reserva r WHERE r.reservaPK.numEjemplar = :numEjemplar"),
    @NamedQuery(name = "Reserva.findByResId", query = "SELECT r FROM Reserva r WHERE r.reservaPK.resId = :resId"),
    @NamedQuery(name = "Reserva.findByPrsIdentificacion", query = "SELECT r FROM Reserva r WHERE r.reservaPK.prsIdentificacion = :prsIdentificacion"),
    @NamedQuery(name = "Reserva.findByResFecha", query = "SELECT r FROM Reserva r WHERE r.resFecha = :resFecha"),
    @NamedQuery(name = "Reserva.findByResFechaPrestamo", query = "SELECT r FROM Reserva r WHERE r.resFechaPrestamo = :resFechaPrestamo"),
    @NamedQuery(name = "Reserva.findByResFechaDevolucion", query = "SELECT r FROM Reserva r WHERE r.resFechaDevolucion = :resFechaDevolucion"),
    @NamedQuery(name = "Reserva.findByResFechaPrevista", query = "SELECT r FROM Reserva r WHERE r.resFechaPrevista = :resFechaPrevista"),
    @NamedQuery(name = "Reserva.findByResEstado", query = "SELECT r FROM Reserva r WHERE r.resEstado = :resEstado"),
    @NamedQuery(name = "Reserva.findByResRenovacion", query = "SELECT r FROM Reserva r WHERE r.resRenovacion = :resRenovacion")})
public class Reserva implements Serializable {
    private static final long serialVersionUID = 1L;
    @EmbeddedId
    protected ReservaPK reservaPK;
    @Basic(optional = false)
    @NotNull
    @Column(name = "res_fecha")
    @Temporal(TemporalType.TIMESTAMP)
    private Date resFecha;
    @Basic(optional = false)
    @NotNull
    @Column(name = "res_fecha_prestamo")
    @Temporal(TemporalType.TIMESTAMP)
    private Date resFechaPrestamo;
    @Basic(optional = false)
    @NotNull
    @Column(name = "res_fecha_devolucion")
    @Temporal(TemporalType.TIMESTAMP)
    private Date resFechaDevolucion;
    @Basic(optional = false)
    @NotNull
    @Column(name = "res_fecha_prevista")
    @Temporal(TemporalType.TIMESTAMP)
    private Date resFechaPrevista;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 1)
    @Column(name = "res_estado")
    private String resEstado;
    @Basic(optional = false)
    @NotNull
    @Column(name = "res_renovacion")
    private int resRenovacion;
    @JoinColumns({
        @JoinColumn(name = "volumen_id", referencedColumnName = "volumen_id", insertable = false, updatable = false),
        @JoinColumn(name = "num_ejemplar", referencedColumnName = "num_ejemplar", insertable = false, updatable = false)})
    @ManyToOne(optional = false)
    private Ejemplar ejemplar;
    @JoinColumn(name = "prs_identificacion", referencedColumnName = "prs_identificacion", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private BPersona bPersona;

    public Reserva() {
    }

    public Reserva(ReservaPK reservaPK) {
        this.reservaPK = reservaPK;
    }

    public Reserva(ReservaPK reservaPK, Date resFecha, Date resFechaPrestamo, Date resFechaDevolucion, Date resFechaPrevista, String resEstado, int resRenovacion) {
        this.reservaPK = reservaPK;
        this.resFecha = resFecha;
        this.resFechaPrestamo = resFechaPrestamo;
        this.resFechaDevolucion = resFechaDevolucion;
        this.resFechaPrevista = resFechaPrevista;
        this.resEstado = resEstado;
        this.resRenovacion = resRenovacion;
    }

    public Reserva(String volumenId, int numEjemplar, long resId, String prsIdentificacion) {
        this.reservaPK = new ReservaPK(volumenId, numEjemplar, resId, prsIdentificacion);
    }

    public ReservaPK getReservaPK() {
        return reservaPK;
    }

    public void setReservaPK(ReservaPK reservaPK) {
        this.reservaPK = reservaPK;
    }

    public Date getResFecha() {
        return resFecha;
    }

    public void setResFecha(Date resFecha) {
        this.resFecha = resFecha;
    }

    public Date getResFechaPrestamo() {
        return resFechaPrestamo;
    }

    public void setResFechaPrestamo(Date resFechaPrestamo) {
        this.resFechaPrestamo = resFechaPrestamo;
    }

    public Date getResFechaDevolucion() {
        return resFechaDevolucion;
    }

    public void setResFechaDevolucion(Date resFechaDevolucion) {
        this.resFechaDevolucion = resFechaDevolucion;
    }

    public Date getResFechaPrevista() {
        return resFechaPrevista;
    }

    public void setResFechaPrevista(Date resFechaPrevista) {
        this.resFechaPrevista = resFechaPrevista;
    }

    public String getResEstado() {
        return resEstado;
    }

    public void setResEstado(String resEstado) {
        this.resEstado = resEstado;
    }

    public int getResRenovacion() {
        return resRenovacion;
    }

    public void setResRenovacion(int resRenovacion) {
        this.resRenovacion = resRenovacion;
    }

    public Ejemplar getEjemplar() {
        return ejemplar;
    }

    public void setEjemplar(Ejemplar ejemplar) {
        this.ejemplar = ejemplar;
    }

    public BPersona getBPersona() {
        return bPersona;
    }

    public void setBPersona(BPersona bPersona) {
        this.bPersona = bPersona;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (reservaPK != null ? reservaPK.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Reserva)) {
            return false;
        }
        Reserva other = (Reserva) object;
        if ((this.reservaPK == null && other.reservaPK != null) || (this.reservaPK != null && !this.reservaPK.equals(other.reservaPK))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entidades.Reserva[ reservaPK=" + reservaPK + " ]";
    }
    
}
